package com.ruoyi.order.service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.ruoyi.businessOrder.domain.BusinessOrder;
import com.ruoyi.businessOrder.domain.dto.RefundApplyDto;
import com.ruoyi.businessOrder.domain.dto.RefundAuditDto;
import com.ruoyi.distributor.domain.DistributionUser;
import com.ruoyi.dto.PayDto;
import com.ruoyi.goodsDetail.domain.OrderGoodsDetail;
import com.ruoyi.order.domain.Order;
import com.ruoyi.order.domain.OrderCreateDTO;
import com.ruoyi.rebateRule.domain.RebateRule;
import org.springframework.transaction.annotation.Transactional;

/**
 * 订单信息Service接口
 * 
 * @author ruoyi
 * @date 2025-06-03
 */
public interface IOrderService 
{
    /**
     * 查询订单信息
     * 
     * @param orderId 订单信息主键
     * @return 订单信息
     */
    public Order selectOrderByOrderId(Long orderId);

    /**
     * 查询订单信息列表
     * 
     * @param order 订单信息
     * @return 订单信息集合
     */
    public List<Order> selectOrderList(Order order);

    /**
     * 新增订单信息
     * 
     * @param order 订单信息
     * @return 结果
     */
    public int insertOrder(Order order);

    /**
     * 修改订单信息
     * 
     * @param order 订单信息
     * @return 结果
     */
    public int updateOrder(Order order);

    /**
     * 批量删除订单信息
     * 
     * @param orderIds 需要删除的订单信息主键集合
     * @return 结果
     */
    public int deleteOrderByOrderIds(Long[] orderIds);

    /**
     * 删除订单信息信息
     * 
     * @param orderId 订单信息主键
     * @return 结果
     */
    public int deleteOrderByOrderId(Long orderId);

    /**
     * 创建订单信息
     *
     * @param payDto
     * @param platform
     * @return Order
     */
    Order createOrder(PayDto payDto, String platform);

    /**
    * 查询下单用户的上级分销员
    *
    * @param userId 下单用户ID
    * @return 上级分销员信息，如果没有上级则返回null
    */
    public DistributionUser getParentDistributor(Long userId);

    /**
     * 创建订单信息
     *
     * @param createDTO
     * @return
     */
    public Order createFullOrder(OrderCreateDTO createDTO);

    /**
     * 小程序获取预支付id
     */
    HashMap<String, Object> miniAppGetPrePayId(Long orderId) throws Exception;

    /**
     * 通过JSAPI/小程序下单接口获取到发起支付的必要参数prepay_id,构造签名
     */
    Map<String, String> getWxpayParams(Long orderId, String orderNo, Integer totalFee, String openId) throws Exception;

    /**
     * 小程序关闭待支付订单
     */
    HashMap<String, Object> miniAppCloseOrder(Long orderId) throws Exception;

    /**
     * 小程序发起退款
     */
    HashMap<String, Object> miniAppRefund(Long orderId, String reason) throws Exception;

    /**
     * 申请退款
     */
    void applyRefund(RefundApplyDto refundApplyDto);

    /**
     * 退款申请审核
     */
    void auditRefundApplication(Long refundId, RefundAuditDto auditDto) throws Exception;

    /**
     * 根据顾客id和商品订单状态获取交易订单列表
     */
    List<Order> selectOrderByGuestIdAndOrderStatus(Long guestId, String orderStatus);

    /**
     * 根据顾客id和商品订单状态获取交易订单列表（分页）
     */
    List<Order> selectOrderByGuestIdAndOrderStatusWithPagination(Long guestId, String masterStatus, int pageNum, int pageSize);

    /**
     * 统计顾客id和商品订单状态下的订单数量
     */
    int countOrderByGuestIdAndOrderStatus(Long guestId, String masterStatus);

    /**
     * 根据订单id获取订单信息，包含订单详情
     */
    // 在 OrderServiceImpl.java 中添加
    public Order selectOrderByOrderIdWithDetails(Long orderId);

    /**
     * 获取订单列表时，将订单状态为'3'（退款中）的优先级设为最高，排在最前面
     * 获取交易订单列表
     */
    List<Order> selectOrderSummaryList(Order order);

    /**
     * 微信支付分账
     *
     * @param orderId 订单ID
     * @return 分账结果
     */
    Map<String, Object> profitSharing(Long orderId) throws Exception;

    /**
     * 根据订单号获取订单信息
     *
     * @param orderCode 订单号
     * @return 订单信息
     */
    public Order getByOrderCode(String orderCode);

    /**
     * 更新订单状态为已支付
     *
     * @param outTradeNo 商户订单号
     * @param transactionId 微信支付交易号
     * @param successTime 支付成功时间
     * @return 更新结果
     */
    boolean updateOrderStatus(String outTradeNo, String transactionId, String successTime);


    /**
     * 匹配返佣规则
     *
     * @param order 订单信息
     * @param distributor 分销员信息
     * @param relationLevel 关系层级
     * @return 返佣规则
     */
    public RebateRule matchRebateRule(Order order, DistributionUser distributor, String relationLevel);

    /**
     * 查询订单支付状态
     *
     * @param orderNo 订单号
     * @return 订单支付状态
     */
    public String checkOrderPaymentStatus(String orderNo);

    /**
     * 根据核销码获取订单信息
     *
     * @param verificationCode 核销码
     * @return 订单信息
     */
    Order selectOrderByVerificationCode(String verificationCode);

    /**
     * 核销订单
     *
     * @param verificationCode 核销码
     * @return 是否核销成功
     */
    @Transactional(rollbackFor = Exception.class)
    boolean verifyOrderWithAuth(String verificationCode);

    /**
     * 重新生成核销码
     *
     * @param orderId 订单ID
     * @return 新的核销码
     */
    String regenerateVerificationCode(Long orderId);

    /**
     * 根据订单ID获取核销信息
     *
     * @param orderId 订单ID
     * @return 核销信息
     */
    Map<String, Object> getOrderVerificationInfo(Long orderId);
}
